package org.bluedream.comm.base;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.*;
import org.bluedream.comm.fill.annotation.FillType;
import org.bluedream.comm.fill.annotation.TargetField;
import org.bluedream.comm.utils.EmptyUtil;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;

//成成toString方法
@ToString
@NoArgsConstructor
public abstract class BaseEntity<T> implements Serializable {
    private static final long serialVersionUID = 3404279284981557237L;

    // 状态（0正常 1删除 2停用 3冻结）
    public static final String STATUS_DELETE = "1";
    public static final String STATUS_NORMAL = "0";

    @Setter
    @Getter
    @NonNull
    @TableId
    @TargetField(fill = FillType.INSERT , fillMethod = "setId")
    protected String    id;

    @Setter
    @Getter
    @NonNull
    protected String    createBy;
    @Setter
    @Getter
    @NonNull
    @TargetField(fill = FillType.INSERT , fillMethod = "setCreateDate")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    protected Date createDate;
    @Setter
    @Getter
    @NonNull
    protected String    updateBy;
    @Setter
    @Getter
    @NonNull
    @TargetField(fill = FillType.INSERT_UPDATE , fillMethod = "setUpdateDate")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    protected Date      updateDate;
    @Setter
    @Getter
    @NonNull
    /**
     * TargetField 注解：
     * fill：确定何时 加载填充器。取值类型：FillType 枚举值:DEFAULT\INSERT\UPDATE\INSERT_UPDATE , DEFAULT时，插入时有效。
     * value：
     *       1.属性为 Timestamp 类型时，value值无效，填充器自动取当前时间。boolean、Boolean时，传入 字符串true或者false。字符串类型直接传值即可
     *       2.id字段，系统自动生成id，如需手工传入，请重写GoalFieldFill类中的setEntity方法。
     *       3.默认 填充器会自动处理 String、Timestamp、boolean、Boolean数据，其他类型需要重写 GoalFieldFill类中的setEntity方法。
     * fillMethod：定义 填充器 调用的set方法名
     */
    @TargetField(fill = FillType.INSERT , value = STATUS_NORMAL , fillMethod = "setStatus")
    protected String    status;
    @Setter
    @Getter
    protected String    remarks;

    //非数据库字段
    @TableField(exist = false)
    protected boolean isNewRecord ;
    @TableField(exist = false)
    protected boolean isChecked;

    public boolean getIsChecked(){
        return this.isChecked;
    }

    public void setIsChecked(boolean isChecked){
        this.isChecked = isChecked;
    }

    public boolean getIsNewRecord() {
        return this.isNewRecord || EmptyUtil.isEmpty(this.getId());
    }

    public void setIsNewRecord(boolean isNewRecord){
        this.isNewRecord = isNewRecord;
    }

    public BaseEntity(String id) {
        this.id = id;
    }

}
